/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package miselania.tiposgenericos;

import com.sun.media.sound.AuFileReader;
import java.util.Iterator;

/**
 *
 * @author cristhy
 */

//para declarar tipos genericos se usan los simbolos <> dentro de este una simbologia para poder
//representar al conjunto de objetos de un tipo aun no deifinido

public class miLinkedListIterator<E> implements Iterable<E> {    
    // atributos
    protected E datos;
    protected NodoIterator<E>  primero;

    int contador=0;

    public miLinkedListIterator() {
        this.datos=null;
        this.primero=null;
    }
    public miLinkedListIterator(E dato, NodoIterator<E>  siguiente) {
        this.datos=dato;
        this.primero=siguiente;
        this.primero.posicion=contador;
    }

    public void agregar(E y){
        NodoIterator<E> nuevito= new NodoIterator<E> (y);
        nuevito.sgt=primero;
        nuevito.posicion=0;//siempre se pone en la primera posicion
        //nuevito.sgt.posicion=contador;
        primero=nuevito;
        
        contador++;
        //ahora debemos actualizar las posiciones de los k vienen
        NodoIterator<E> aux=primero.sgt;
        NodoIterator<E> cambio=primero.sgt;
        int i=0;
        while(aux !=null){
            cambio.posicion=i+1;
            aux=aux.sgt;
            primero.sgt=cambio;
            
        }
        primero.sgt=aux;
    }
 
    public void insertarFianl(E y){
       NodoIterator<E> n1 = new NodoIterator<E> (y);
       this.contador++;
       NodoIterator<E> auxiliar= primero;
       if(auxiliar==null)
           primero=n1;
       else
       {
           while (auxiliar.sgt != null){
               auxiliar=auxiliar.sgt;
           }               
            // tenemos como auxiliar de referencia al ultimo nodod de la lista
               auxiliar.sgt=n1;
       }
       
    }
    
    public boolean borrar(E y){
        NodoIterator<E> auxiliar= primero,anterior=null;
        boolean resp= false;
        while (auxiliar != null && !auxiliar.datos1.equals(y)) {            
            anterior=auxiliar;
            auxiliar=auxiliar.sgt;
        }
        if(auxiliar !=null)
        {
            resp=true;
            this.contador--;
            if(anterior==null)
                //si se va a borrar el primer elemento de la lista
                primero=auxiliar.sgt;
            else
                //si se borrara un elemento intermedio
                anterior.sgt=auxiliar.sgt;
        }
        return resp;
    }
    @Override
    public String toString(){
        String respuest="";
        for (NodoIterator<E> a = primero;a!= null ;a=a.sgt)
            respuest+= a.datos1.toString()+"\n";
        return respuest;
    }

 
        
  /*
               }
 while (iterador.hasNext()){
        System.out.print(iterador.next()+" ");  
        }*/
      
    
    /*
     * 5) Modificar la tarea 3 para que la lista enlazada de tipos genéricos implemente la Interface Iterator. 

6) Utilice la interfaz Map para crear un diccionario de palabras

     */


    @Override
    public Iterator<E> iterator() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

   
    
}
